package simple.flow.handler;


import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import simple.flow.config.shiro.LoginUserUtil;
import simple.flow.modules.system.dto.user.LoginUser;

import java.time.LocalDateTime;
import java.util.Optional;

/**
 * 基础类的自动填充
 *
 * @author lhd
 * @since 2025/4/2 16:15
 */

@Component
public class MybatisMetaObjectHandler implements MetaObjectHandler {


    @Override
    public void insertFill(MetaObject metaObject) {
        // 获得创建人
        LoginUser loginUser = LoginUserUtil.getLoginUser();

        // 检查是否存在 createBy 字段
        if (metaObject.hasGetter("createBy")) {
            // 获得创建人
            // 设置创建人
            this.strictInsertFill(metaObject, "createBy", String.class, Optional.ofNullable(loginUser).map(LoginUser::getId).orElse(null));
        }

        // 检查是否存在 createTime 字段
        if (metaObject.hasGetter("createTime")) {
            // 设置创建时间
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 获得更新人
        LoginUser loginUser = LoginUserUtil.getLoginUser();

        // 检查是否存在 updateBy 字段
        if (metaObject.hasGetter("updateBy")) {
            // 获得更新人
            // 设置更新人
            this.strictUpdateFill(metaObject, "updateBy", String.class, Optional.ofNullable(loginUser).map(LoginUser::getId).orElse(null));
        }

        // 检查是否存在 updateTime 字段
        if (metaObject.hasGetter("updateTime")) {
            // 设置更新时间
            this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        }
    }

}
